/*
三-1：
当字符串是常量时不可更改
*/
//自实现strcmp函数
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int myStrcmp(const char * str1, const char * str2)
{
    if (str1 == NULL && str2 != NULL)
    {
        return -1;
    }
    if (str1 != NULL && str2 == NULL)
    {
        return 1;
    }
    if (str1 == NULL && str2 == NULL)
    {
        return 0;
    }

    //备份指针
    const char *tmpStr1 = str1;
    const char *tmpStr2 = str2;

    while (*tmpStr1 != '\0' && *tmpStr2 != '\0')
    {
        if (*tmpStr1 > *tmpStr2)
        {
            return *tmpStr1 - *tmpStr2;
        }
        if (*tmpStr1 < *tmpStr2)
        {
            return *tmpStr1 - *tmpStr2;
        }
        tmpStr1++;
        tmpStr2++;
    }
    /* 程序到这个地方只需要判断谁没有结束 */
    /* 没有结束的字符串就大*/
    return *tmpStr1 - *tmpStr2;
}

/* 三-5:
    结构体里定义了一个指针
    一定要分配空间，才能进行赋值操作

 */

/* 四-3
1 去除所有的非字母的字符
2 将小写变成大写
3 判断回文
 */

int isPalindrome01(char *str)
{
    int len = strlen(str);

    /* str 为字符串常量，必须要开辟空间 */
    char *buffer = (char *)malloc(sizeof(char) * (len + 1));
    if (buffer == NULL)
    {
        return -1;
    } 

    int pos = 0;
    for (int idx = 0; idx < len; idx++)
    {
        if (str[idx] >= 'a' && str[idx] <= 'z' || str[idx] >= 'A' && str[idx] <= 'Z')
        {
            buffer[pos++] = str[idx];
        }
    }
    /* 添加结束符 */
    buffer[pos] = '\0';

    /* 第二步 */
    for (int idx = 0; idx < pos; idx++)
    {
        buffer[idx] = toupper(buffer[idx]);
    }

    /* 第三步 */
    int begin = 0;
    int end = pos - 1;
    while (begin < end)
    {
        if (buffer[begin] != buffer[end])
        {
            return 0;// 结束
        }
        begin++;
        end--;
    }

    /* 一定要释放 */
    if (buffer)
    {
        free(buffer);
        buffer = NULL;
    }
    return 1;

}


static int charIsAlphabet(char ch)
{
    if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z')
    {
        return 1;
    }
    return 0;
}

int isPalindrome03(char *str)
{
    int len = strlen(str);

    /* 第三步: */
    int begin = 0;
    int end = len - 1;
    while (begin < end)
    {
        if (charIsAlphabet((str[begin])))
        {
            if (charIsAlphabet((str[end])))
            {
                if (toupper(str[begin]) == toupper(str[end]))
                {
                    begin++;
                    end--;
                }
                else
                {
                    return 0;
                }
            }
            else
            {
                end--;
            }
        }
        else
        {
            begin++;
        }
    }
    return 1;
}


int main()
{
    char *str = " A man, a pAan, a canal: Panama";

    int ret = isPalindrome01(str);

    printf("ret:%d\n", ret);
    return 0;
}





